
local screen  = require 'guac.screen'

local setmetatable, ipairs, require
    = setmetatable, ipairs, require
local tremove
    = table.remove


module (...)


local scenenode_proto = {}
local scenenode_meta = {__index = scenenode_proto}

function node(def)
  def = def or {}
  local parent = def.parent
  if parent then
    parent[#parent+1] = def
  end
  return setmetatable(def, scenenode_meta)
end

function scenenode_proto:render()
  self:renderchildren()
end

function scenenode_proto:renderchildren()
  for i,child in ipairs(self) do
    child:render()
  end
end

function scenenode_proto:add(other_node)
  if other_node.parent then
    other_node.parent:remove(other_node)
  end
  other_node.parent = self
  self[#self+1] = other_node
end

function scenenode_proto:remove(other_node)
  for i,child in ipairs(self) do
    if (child == other_node) then
      child.parent = nil
      return tremove(self,i)
    end
  end
  return nil
end

root = node()

require ((...) .. ".sprite")
